FastAPIをuvを使って、Dockerfileを作成
まえがき
前回は uv で Python のプロジェクト管理をしました。
Fastapi を Docker で起動するための Dockerfile を作成します。
uv を使う方法と Python のデフォルトのパッケージ管理 pip を使った方法を作成します。
uv をつかった Dockerfile
Dockerfile 作成
前提として docker コマンドはインストール済みとします。
uv のドキュメントの FastAPI での使用例を参考に、Dockerfile
を作成します。
FROM python:3.12-slim
# Install uv.
COPY /uv /bin/uv
# Copy the application into the container.
COPY . /app
# Install the application dependencies.
WORKDIR /app
RUN uv sync --frozen --no-cache
# Run the application.
CMD ["/app/.venv/bin/fastapi", "run", "app/main.py", "--port", "80", "--host", "0.0.0.0"]
docker で build して、run をしてみる
$ docker build -t fastapi-app .
$ docker run -p 8000:80 fastapi-app
http://127.0.0.1:8000 にアクセスすると、{"Hello":"World"}
と表示されて、動作確認ができました。
pip をつかった Dockerfile
requirements.txt に吐き出す
uv を使わず、標準の pip を使う場合は、pip でも読めるrequirements.txt
で依存関係を作成します。
uv からrequirements.txt
を作成するコマンドがあります。
$ uv export -o requirements.txt --no-hashes
Dockerfile を作成
FastAPI のドキュメントを参考に Dockerfile
を作ります。
FROM python:3.12-slim
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
docker で build して、run をしてみる
FROM python:3.12-slim
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
docker で build して、run をしてみる
$ docker build -t fastapi-app .
$ docker run -p 8000:80 fastapi-app
http://127.0.0.1:8000 にアクセスすると、{"Hello":"World"}
と表示されて、動作確認ができました。
まとめ
本番環境では、なるべく軽く、脆弱性発生要素を少なくするために必須以外のツール類を削除したいケースはあります。
uv のセットアップをしたくない場合もあると思いますので、その時はrequirements.txt
の形式に出力することもできます。開発では uv を便利に使って、本番では pip を使うなど切り替えも簡単ですね。